#include "man_machine.h"
#include "router.h"
#include <pthread.h>

// 人机交互线程ipMacReg
void* man_function(void *reg)
{
    ipMacIfo* ipMacReg = (ipMacIfo*)reg;

    while(1){
        pthread_mutex_lock(&mutex); // 加锁
        //printf("输入功能选项(0~8):");
        //printf("当前在线程2\n");
        int menuSeleFlag = pthreadSeleFlag;
        
        if(pthreadSeleFlag < 0 || pthreadSeleFlag > 8){
            //printf("进行线程1的功能\n");
            pthread_cond_wait(&cond, &mutex); // 将当前线程阻塞
        } 
        //DEBUG;
        switch(menuSeleFlag){  // 功能选择
            case 0: // 打开菜单
                menuHelp(); 
                pthreadSeleFlag = -1; break;// 打开菜单
            case 1: // 添加黑名单IP
                printf("请输入需要添加的新IP(格式:10.7.189.1):");
                fflush(stdin);
                uc8 add_ip[30];
                scanf("%s", add_ip);
                getchar();  // 清除输入缓冲区中的换行符
                printf("%s\n", add_ip);
                if(determine(add_ip)){
                    printf("请输入正确的IP地址!\n");
                }
                else{
                    ipMacSize add_dataSize;
                    memset(&add_dataSize, 0, sizeof(ipMacSize));
                    add_dataSize.ipSize = sizeof(add_ip);
                    insertIpMacData(ipMacReg->ipMacFilterHead, add_ip, NULL, &add_dataSize);
                }
                pthreadSeleFlag = -1; break;
            case 2: // 删除黑名单IP
                printf("请输入需要删除的IP(格式:10.7.189.1):");
                fflush(stdin);
                char delete_ip[16];
                //fgets(delete_ip,sizeof(delete_ip),stdin);
                scanf("%s",delete_ip);
                if(determine(delete_ip)){
                    printf("请输入正确的IP地址!\n");
                }else{
                    ipMacSize* delete_dataSize;
                    if (delete_dataSize == NULL){
                        DEBUGERROR;
                        //return NULL;
                    }
                    memset(delete_dataSize, 0, sizeof(ipMacSize));
                    delete_dataSize->ipSize = sizeof(add_ip);
                    deleteIpMacData(ipMacReg->ipMacFilterHead, delete_ip, NULL);
                }
                pthreadSeleFlag = -1; break;
            case 3: // 查看现有黑名单IP
                displayIpMacList(ipMacReg->ipMacFilterHead);
                pthreadSeleFlag = -1; break; // 显示过滤链表
#if 0
            case 4: // 添加敏感词汇
                printf("请输入需要添加的新敏感词汇：");
                fflush(stdin);
                char add_buf[64];
                scanf("%s",add_buf);
                add_Susceptible(terms,add_buf);
                menuSeleFlag = -1;  break;
            case 5: // 删除的敏感词汇
                printf("请输入需要删除的敏感词汇：");
                fflush(stdin);
                char delete_buf[64];
                scanf("%s",delete_buf);
                delete_Susceptible(terms,delete_buf);
                break;
            case 6: // 查看已有敏感词汇
                ergodic_Susceptible(terms);
                menuSeleFlag = -1; break;
#endif
            case 7: // 查看ARP表
                displayIpMacList(ipMacReg->ipMacHead);
                pthreadSeleFlag = -1; break;
            case 8: // 回收资源和结束线程
                destoryIpMacList(&(ipMacReg->ipMacHead)); // 回收链表的空间
                if(ipMacReg->ipMacFilterHead != NULL){
                     destoryIpMacList(&(ipMacReg->ipMacFilterHead));
                }
                close(ipMacReg->sockFd); // 关闭原始套接字
                exit(0); break;
        }
        pthread_cond_signal(&cond); // 发送信号通知线程1 
        pthread_mutex_unlock(&mutex); // 解锁
    }
    return NULL;
}

// 菜单功能选择函数
int menuFuncSelet(int FuncVal, ipMacIfo* ipMacReg)
{
    int ipStrLen = 0;
    char add_ip[30];
    char delete_ip[16];
    switch(FuncVal){  // 功能选择
        case 0: // 打开菜单
            menuHelp(); 
            pthreadSeleFlag = -1; break;// 打开菜单
        case 1: // 添加黑名单IP
            printf("请输入需要添加的新IP(格式:10.7.189.1):");
            //fflush(stdin);
            scanf("%s", add_ip);
            getchar();
            printf("%s\n", add_ip);
            if(determine(add_ip)){
                printf("请输入正确的IP地址!\n");
            }
            else{
                ipMacSize add_dataSize;
                memset(&add_dataSize, 0, sizeof(ipMacSize));
                add_dataSize.ipSize = sizeof(add_ip);
                insertIpMacData(ipMacReg->ipMacFilterHead, add_ip, NULL, &add_dataSize);
            }
            pthreadSeleFlag = -1; break;
        case 2: // 删除黑名单IP
            printf("请输入需要删除的IP(格式:10.7.189.1):");
            scanf("%s",delete_ip);
            if(determine(delete_ip)){
                printf("请输入正确的IP地址!\n");
            }else{
                ipMacSize* delete_dataSize;
                if (delete_dataSize == NULL){
                    DEBUGERROR;
                    //return NULL;
                }
                memset(delete_dataSize, 0, sizeof(ipMacSize));
                delete_dataSize->ipSize = sizeof(add_ip);
                deleteIpMacData(ipMacReg->ipMacFilterHead, delete_ip, NULL);
            }
            pthreadSeleFlag = -1; break;
        case 3: // 查看现有黑名单IP
            displayIpMacList(ipMacReg->ipMacFilterHead);
            pthreadSeleFlag = -1; break; // 显示过滤链表
#if 0
        case 4: // 添加敏感词汇
            printf("请输入需要添加的新敏感词汇：");
            fflush(stdin);
            char add_buf[64];
            scanf("%s",add_buf);
            add_Susceptible(terms,add_buf);
            menuSeleFlag = -1;  break;
        case 5: // 删除的敏感词汇
            printf("请输入需要删除的敏感词汇：");
            fflush(stdin);
            char delete_buf[64];
            scanf("%s",delete_buf);
            delete_Susceptible(terms,delete_buf);
            break;
        case 6: // 查看已有敏感词汇
            ergodic_Susceptible(terms);
            menuSeleFlag = -1; break;
#endif
        case 7: // 查看ARP表
            displayIpMacList(ipMacReg->ipMacHead);
            pthreadSeleFlag = -1; break;
        case 8: // 回收资源和结束线程
            destoryIpMacList(&(ipMacReg->ipMacHead)); // 回收链表的空间
            if(ipMacReg->ipMacFilterHead != NULL){
                    destoryIpMacList(&(ipMacReg->ipMacFilterHead));
            }
            close(ipMacReg->sockFd); // 关闭原始套接字
            exit(0); break;
    }  
    return 0;
}

//帮助菜单
int menuHelp()
{
    printf("#--------帮助信息--------------#\n");
    printf("|----按键0--查看帮助信息--------|\n");
    printf("|----按键1--添加新IP黑名单------|\n");
    printf("|----按键2--删除现有IP黑名单----|\n");
    printf("|----按键3--查看现有IP黑名单----|\n");
    printf("|----按键4--添加新敏感词汇------|\n");
    printf("|----按键5--删除现有敏感词汇----|\n");
    printf("|----按键6--查看现有敏感词汇----|\n");
    printf("|----按键7--查看ARP表-----------|\n");
    printf("#----按键8--退出路由器----------#\n");

    return 0;
}

//  判断输入是否为IP地址
int determine(char buf[16])
{
    if((strstr(buf,"..")!=NULL)||(strstr(buf,"...")!=NULL))
    {
        return 1;
    }
    char *p=buf;
    char q[]=".";
    int count=0;
    
    while ((p = strstr(p, q)) != NULL) 
    {
        count++;
        if (count == 3)
        {
            return 0;
        }
        p++;
    }
    return 1;
}
